﻿
namespace SistemaLogistica.Windows.Forms.Adquisicion.Operaciones
{
    using System;
    using System.Drawing;
    using System.Windows.Forms;
    using EDOSwit.Controls.Helpers;
    using EDOSwit.Controls.Types;
    using EDOSwit.Controls.UserControls;
    using SistemaLogistica.Business.Entities;
    using SistemaLogistica.Business.Entities.Types;
    using SistemaLogistica.Business.Logic;
    using SistemaLogistica.Windows.Forms.BienPatrimonial.Mantenedores;
    using SistemaLogistica.Windows.Helpers;

    public partial class CwfOrdenCompra : MaestroDetalleSeguro, Observador
    {
        private EstadoActual estadoDetalle;

        public CwfOrdenCompra()
        {
            InitializeComponent();
        }

        protected override void LoadPermisos()
        {
            this.TsMenu.Permisos.AddRange(Metodos.GetPermisos(Convert.ToByte(this.Tag)));
        }

        protected override void FocusKeyPress(object sender, KeyPressEventArgs e)
        {
            base.FocusKeyPress(sender, e);
        }

        private void cmbTipoOrden_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (this.estadoActual != EstadoActual.Normal)
            {
                try
                {
                    this.dgvDetalle.Rows.Clear();
                    LoadOrdenesPedidos();                    
                }
                catch (Exception ex)
                {
                    Mensaje.ShowMessageAlert(this.ParentForm, this.Titulo, ex.Message);
                }
            }
        }

        private void cmbPedido_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (this.cmbPedido.SelectedIndex != -1)
            {
                OrdenPedido ordenPedido = OrdenPedidoManager.Instancia.ObtenerPorID(Convert.ToInt32(this.cmbPedido.SelectedValue));
                this.detalleOrdenPedidoBindingSource.DataSource = ordenPedido.Detalle;
                this.txtOrdenPedido.Text = "Realizado por " + ordenPedido.Pedido.Area.Nombre + " el " + ordenPedido.Fecha.ToShortDateString();
            }
            else
            {
                this.dgvDetalleOP.Rows.Clear();
            }
        }

        private void tabMantenedores_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (this.cmbTipoOrden.SelectedIndex != this.tabMantenedores.SelectedIndex)
            {
                this.tabMantenedores.SelectedIndex = this.cmbTipoOrden.SelectedIndex;
            }
        }

        private void btnBuscar_Click(object sender, EventArgs e)
        {
            try
            {
                this.MaestroBindingSource.DataSource = OrdenCompraManager.Instancia.BuscarPorFechas(this.dtpDesde.Value, this.dtpHasta.Value);
                this.dgvMaestro.DataSource = this.MaestroBindingSource;
            }
            catch (Exception ex)
            {
                Mensaje.ShowMessageAlert(this.ParentForm, this.Titulo, ex.Message);
            }
        }

        protected override void CellPainting(ref DataGridViewCellPaintingEventArgs e)
        {
            Graphics g = e.Graphics;
            bool selected = ((e.State & DataGridViewElementStates.Selected) == DataGridViewElementStates.Selected);
            Color fcolor = (selected ? e.CellStyle.SelectionForeColor : e.CellStyle.ForeColor);
            Color bcolor = (selected ? e.CellStyle.SelectionBackColor : e.CellStyle.BackColor);
            Font font = e.CellStyle.Font;
            font = new Font("Tahoma", 7);

            OrdenCompra ordenCompra = this.MaestroBindingSource[e.RowIndex] as OrdenCompra;

            if (ordenCompra != null)
            {
                int x = e.CellBounds.Left + e.CellStyle.Padding.Left;
                int y = e.CellBounds.Top + e.CellStyle.Padding.Top;
                int width = e.CellBounds.Width - (e.CellStyle.Padding.Left + e.CellStyle.Padding.Right);
                int height = 13 + (e.CellStyle.Padding.Top + e.CellStyle.Padding.Bottom);

                g.FillRectangle(new SolidBrush(bcolor), e.CellBounds);

                y = y + height - 1;

                if (e.ColumnIndex == 0)
                {
                    font = new Font("Tahoma", 8, FontStyle.Bold);

                    if (selected)
                        TextRenderer.DrawText(e.Graphics, "Nº: " + ordenCompra.IdOrdenCompra.ToString().PadLeft(7, '0'), font, new Rectangle(x, y, width, height), fcolor, TextFormatFlags.PreserveGraphicsClipping | TextFormatFlags.EndEllipsis);
                    else
                        TextRenderer.DrawText(e.Graphics, "Nº: " + ordenCompra.IdOrdenCompra.ToString().PadLeft(7, '0'), font, new Rectangle(x, y, width, height), System.Drawing.Color.Blue, TextFormatFlags.PreserveGraphicsClipping | TextFormatFlags.EndEllipsis);

                    font = new Font("Tahoma", 8);
                    y = y + height - 1;
                    TextRenderer.DrawText(e.Graphics, ordenCompra.OrdenPedido.Pedido.Area != null ? ordenCompra.OrdenPedido.Pedido.Area.Nombre : string.Empty, font, new Rectangle(x, y, width, height), fcolor, TextFormatFlags.PreserveGraphicsClipping | TextFormatFlags.EndEllipsis);
                }
                else
                {
                    font = new Font("Tahoma", 9, FontStyle.Bold);
                    if (selected)
                        TextRenderer.DrawText(e.Graphics, ordenCompra.Fecha.ToShortDateString(), font, new Rectangle(x, y, width, height), fcolor, TextFormatFlags.PreserveGraphicsClipping | TextFormatFlags.EndEllipsis);
                    else
                        TextRenderer.DrawText(e.Graphics, ordenCompra.Fecha.ToShortDateString(), font, new Rectangle(x, y, width, height), System.Drawing.Color.Blue, TextFormatFlags.PreserveGraphicsClipping | TextFormatFlags.EndEllipsis);

                    font = new Font("Tahoma", 7);
                    y = y + height - 1;
                    TextRenderer.DrawText(e.Graphics, Enum.GetName(typeof(PedidoType), ordenCompra.OrdenPedido.TipoOrdenPedido), font, new Rectangle(x, y, width, height), fcolor, TextFormatFlags.PreserveGraphicsClipping | TextFormatFlags.EndEllipsis);
                }
            }
        }

        protected override void EventoNuevo()
        {
            this.dtpFecha.Enabled = false;
            this.dtpFecha.Value = EmpresaManager.Instancia.Fecha();
            this.dtpFecha.Focus();
        }

        protected override void EventoEditar()
        {
            this.dtpFecha.Enabled = true;
            this.dtpFecha.Focus();
        }

        protected override void EventoGuardar()
        {
            btnCancelar_Click(this, EventArgs.Empty);
        }

        protected override void EventoCancelar()
        {
            btnCancelar_Click(this, EventArgs.Empty);
        }

        private void btnNuevo_Click(object sender, EventArgs e)
        {
            this.estadoDetalle = EstadoActual.Nuevo;
            EnabledDetailButtons();
            this.ClearDetailCotrols();
        }

        private void btnEditar_Click(object sender, EventArgs e)
        {
            this.estadoDetalle = EstadoActual.Editar;
            EnabledDetailButtons();
        }

        private void btnEliminar_Click(object sender, EventArgs e)
        {
            if (MessageBox.Show("¿Desea eliminar el Registro?", Constantes.TituloMensaje, MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
            {
                this.estadoDetalle = EstadoActual.Eliminar;
                SaveDetailData();
                this.estadoDetalle = EstadoActual.Normal;
            }
        }

        private void btnGuardar_Click(object sender, EventArgs e)
        {
            if (ValidateDetailData())
            {
                if (SaveDetailData())
                {
                    this.estadoDetalle = EstadoActual.Normal;
                    EnabledDetailButtons();
                    this.dgvDetalle.Focus();
                }
            }
        }

        private void btnCancelar_Click(object sender, EventArgs e)
        {
            this.estadoDetalle = EstadoActual.Normal;
            EnabledDetailButtons();
            ClearDetailCotrols();
            this.dgvDetalle.Focus();
        }

        private void dgvDetalle_CellEnter(object sender, DataGridViewCellEventArgs e)
        {
            if (e.ColumnIndex != -1 && e.RowIndex != -1)
            {
                object identity = this.dgvDetalle.Rows[e.RowIndex].Cells[1].Value as Bien;
                if (identity != null)
                {
                    this.tabMantenedores.Focus();
                    switch (this.cmbTipoOrden.SelectedIndex)
                    {
                        case 0:
                            Bien bien = identity as Bien;
                            this.lblIdBien.Text = bien.IdBien.ToString();
                            this.txtNombreB.Text = bien.Nombre;
                            this.txtCantidadB.Text = Convert.ToDecimal(this.dgvDetalle.Rows[e.RowIndex].Cells[2].Value).ToString();
                            this.txtCantidadB.Tag = bien.StockActual;
                            this.txtPrecioB.Text = bien.Precio.ToString();
                            this.cmbEstadoB.SelectedIndex = bien.Estado;
                            this.cmbUnidadB.SelectedValue = bien.UnidadMedidia.IdUnidadMedida;
                            this.txtDescripcionB.Text = bien.Descripcion;
                            this.txtNombreB.Focus();
                            break;
                        case 1:
                            Vehiculo vehiculo = identity as Vehiculo;
                            this.lblIdBien.Text = vehiculo.IdBien.ToString();
                            this.txtNumeroV.Text = vehiculo.NroPlaca;
                            this.txtModeloV.Text = vehiculo.Modelo;
                            this.txtMarcaV.Text = vehiculo.Marca;
                            this.cmbTipoV.SelectedIndex = vehiculo.TipoVehiculo;
                            this.txtPrecioV.Text = vehiculo.Precio.ToString();
                            this.cmbEstadoV.SelectedIndex = vehiculo.Estado;
                            this.txtDescripcionV.Text = vehiculo.Descripcion;
                            this.txtNumeroV.Focus();
                            break;
                        case 2:
                            Telefono telefono = identity as Telefono;
                            this.lblIdBien.Text = telefono.IdBien.ToString();
                            this.txtNumeroT.Text = telefono.NroCelular;
                            this.txtModeloT.Text = telefono.Modelo;
                            this.txtMarcaT.Text = telefono.Marca;
                            this.cmbTipoT.SelectedIndex = int.Parse(telefono.TipoCelular);
                            this.txtPrecioT.Text = telefono.Precio.ToString();
                            this.cmbEstadoT.SelectedIndex = telefono.Estado;
                            this.txtDescripcionT.Text = telefono.Descripcion;
                            this.txtNumeroT.Focus();
                            break;
                        default: break;
                    }
                }
            }
        }

        private void cmbBienes_AfterSelectEvent(object sender, object identity)
        {
            if (identity != null)
            {
                switch (this.cmbTipoOrden.SelectedIndex)
                {
                    case 0:
                        Bien bien = identity as Bien;
                        this.lblIdBien.Text = bien.IdBien.ToString();
                        this.txtNombreB.Text = bien.Nombre;
                        this.txtCantidadB.Text = "0";
                        this.txtCantidadB.Tag = bien.StockActual;
                        this.txtPrecioB.Text = bien.Precio.ToString();
                        this.cmbEstadoB.SelectedIndex = bien.Estado;
                        this.cmbUnidadB.SelectedValue = bien.UnidadMedidia.IdUnidadMedida;
                        this.txtDescripcionB.Text = bien.Descripcion;
                        this.txtNombreB.Focus();
                        break;
                    case 1:
                        Vehiculo vehiculo = identity as Vehiculo;
                        this.lblIdBien.Text = vehiculo.IdBien.ToString();
                        this.txtNumeroV.Text = vehiculo.NroPlaca;
                        this.txtModeloV.Text = vehiculo.Modelo;
                        this.txtMarcaV.Text = vehiculo.Marca;
                        this.cmbTipoV.SelectedIndex = vehiculo.TipoVehiculo;
                        this.txtPrecioV.Text = vehiculo.Precio.ToString();
                        this.cmbEstadoV.SelectedIndex = vehiculo.Estado;
                        this.txtDescripcionV.Text = vehiculo.Descripcion;
                        this.txtNumeroV.Focus();
                        break;
                    case 2:
                        Telefono telefono = identity as Telefono;
                        this.lblIdBien.Text = telefono.IdBien.ToString();
                        this.txtNumeroT.Text = telefono.NroCelular;
                        this.txtModeloT.Text = telefono.Modelo;
                        this.txtMarcaT.Text = telefono.Marca;
                        this.cmbTipoT.SelectedIndex = int.Parse(telefono.TipoCelular);
                        this.txtPrecioT.Text = telefono.Precio.ToString();
                        this.cmbEstadoT.SelectedIndex = telefono.Estado;
                        this.txtDescripcionT.Text = telefono.Descripcion;
                        this.txtNumeroT.Focus();
                        break;
                    default: break;
                }
            }
        }

        private void btnLimpiar_Click(object sender, EventArgs e)
        {
            this.lblIdBien.Text = "0";
            switch (this.cmbTipoOrden.SelectedIndex)
            {
                case 0:
                    this.txtNombreB.Clear();
                    this.txtCantidadB.Clear();
                    this.txtPrecioB.Clear();
                    this.cmbEstadoB.SelectedIndex = -1;
                    this.cmbUnidadB.SelectedIndex = -1;
                    this.txtDescripcionB.Clear();
                    this.txtNombreB.Focus();
                    break;
                case 1:
                    this.txtNumeroV.Clear();
                    this.txtModeloV.Clear();
                    this.txtMarcaV.Clear();
                    this.txtPrecioV.Clear();
                    this.cmbTipoV.SelectedIndex = -1;
                    this.cmbEstadoV.SelectedIndex = -1;
                    this.txtDescripcionV.Clear();
                    this.txtNumeroV.Focus();
                    break;
                case 2:
                    this.txtNumeroT.Clear();
                    this.txtModeloT.Clear();
                    this.txtMarcaT.Clear();
                    this.txtPrecioT.Clear();
                    this.cmbTipoT.SelectedIndex = -1;
                    this.cmbEstadoT.SelectedIndex = -1;
                    this.txtDescripcionT.Clear();
                    this.txtNumeroT.Focus();
                    break;
                default: break;
            }           
        }

        protected override void InitialLoad()
        {
            try
            {
                FrmBienes frm = new FrmBienes();
                frm.BloquearTipoBien = false;
                this.cmbBienes.DropDownForm = frm;

                this.cmbPedido.DisplayMember = "IdOrdenPedido";
                this.cmbPedido.ValueMember = "IdOrdenPedido";
                this.cmbPedido.DisplayColumnNames = "IdOrdenPedido,FechaOrden,Estado";

                this.cmbEstadoB.DataSource = Enum.GetNames(typeof(DisponibilidadType));
                this.cmbEstadoV.DataSource = Enum.GetNames(typeof(DisponibilidadType));
                this.cmbEstadoT.DataSource = Enum.GetNames(typeof(DisponibilidadType));
                this.cmbTipoOrden.DataSource = Enum.GetNames(typeof(PedidoType));
                this.cmbTipoV.DataSource = Enum.GetNames(typeof(VehiculoType));
                this.cmbTipoT.DataSource = Enum.GetNames(typeof(TelefonoType));

                LoadProveedores();
                LoadUnidadMedidas();

                this.MaestroBindingSource.DataSource = OrdenCompraManager.Instancia.Listar();
                this.dgvMaestro.DataSource = this.MaestroBindingSource;
                OcultarColumnas();
                ClearDetailCotrols();
                EnabledDetailButtons();
            }
            catch (Exception ex)
            {
                Mensaje.ShowMessageAlert(this.ParentForm, this.Titulo, ex.Message);
            }
        }

        private void LoadProveedores()
        {
            this.cmbProveedor.ValueMember = "IdProveedor";
            this.cmbProveedor.DisplayMember = "RazonSocial";
            this.cmbProveedor.DisplayColumnNames = "IdProveedor,Ruc,RazonSocial,Telefono";
            this.cmbProveedor.DataSource = ProveedorManager.Instancia.Listar();
        }

        private void LoadUnidadMedidas()
        {
            this.cmbUnidadB.DisplayMember = "Nombre";
            this.cmbUnidadB.ValueMember = "IdUnidadMedida";
            this.cmbUnidadB.DataSource = UnidadMedidaManager.Instancia.Listar();
        }

        private void LoadOrdenesPedidos()
        {
            PedidoType type = (PedidoType)Enum.Parse(typeof(PedidoType), this.cmbTipoOrden.SelectedIndex.ToString());
            this.cmbPedido.DataSource = OrdenPedidoManager.Instancia.ListarPorTipo(type);

            this.tabMantenedores.SelectedIndex = this.cmbTipoOrden.SelectedIndex;
            FrmBienes frm = this.cmbBienes.DropDownForm as FrmBienes;
            frm.TipoBien = this.cmbTipoOrden.SelectedIndex;
        }

        private void OcultarColumnas()
        {
            this.dgvMaestro.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
            this.dgvMaestro.Columns["Empleados"].Visible = false;
            this.dgvMaestro.Columns["OrdenPedido"].Visible = false;
            this.dgvMaestro.Columns["Proveedor"].Visible = false;
            this.dgvMaestro.Columns["Descripcion"].Visible = false;
            this.dgvMaestro.Columns["Estado"].Visible = false;
            this.dgvMaestro.Columns["IdOrdenCompra"].HeaderText = "Ordenes";
        }

        protected override void LoadData(object obj)
        {
            OrdenCompra ordenCompra = obj as OrdenCompra;
            if (ordenCompra != null)
            {
                ordenCompra = OrdenCompraManager.Instancia.ObtenerPorID(ordenCompra.IdOrdenCompra);

                this.identificador = ordenCompra.IdOrdenCompra;
                this.dtpFecha.Value = ordenCompra.Fecha;
                this.cmbProveedor.SelectedValue = ordenCompra.Proveedor.IdProveedor;
                this.cmbTipoOrden.SelectedIndex = ordenCompra.OrdenPedido.TipoOrdenPedido;
                this.tabMantenedores.SelectedIndex = ordenCompra.OrdenPedido.TipoOrdenPedido;
                LoadOrdenesPedidos();
                this.txtOrdenPedido.Text = "Realizado por " + ordenCompra.OrdenPedido.Pedido.Area.Nombre + " el " + ordenCompra.OrdenPedido.Fecha.ToShortDateString();
                this.txtDescripcion.Text = ordenCompra.Descripcion;

                this.dgvDetalle.Rows.Clear();
                foreach (DetalleOrdenCompra d in ordenCompra.Detalle)
                {
                    int index = this.dgvDetalle.Rows.Add(1);
                    this.dgvDetalle.Rows[index].Cells[0].Value = d.Bien.IdBien;
                    this.dgvDetalle.Rows[index].Cells[1].Value = d.Bien;
                    this.dgvDetalle.Rows[index].Cells[2].Value = Convert.ToInt32(d.Cantidad);
                    this.dgvDetalle.Rows[index].Cells[3].Value = d.Monto;
                }
            }
        }

        protected override bool SaveData()
        {
            bool result = false;
            int posicion = this.MaestroBindingSource.Position;

            try
            {
                switch (this.estadoActual)
                {
                    case EstadoActual.Nuevo:
                        OrdenCompraManager.Instancia.Registrar(GetOrdenCompra());
                        break;
                    case EstadoActual.Editar:
                        OrdenCompraManager.Instancia.Actualizar(GetOrdenCompra());
                        break;
                    case EstadoActual.Eliminar:
                        OrdenCompraManager.Instancia.Eliminar(Convert.ToInt32(this.identificador));
                        this.MaestroBindingSource.RemoveCurrent();
                        posicion -= 1;
                        break;
                }
                result = true;
                InitialLoad();
                this.MaestroBindingSource.Position = posicion;
                this.tabMaestro.SelectedIndex = 0;
            }
            catch (Exception ex)
            {
                Mensaje.ShowMessageAlert(this.ParentForm, this.Titulo, ex.Message);
            }
            return result;
        }

        private bool SaveDetailData()
        {
            bool result = true;
            Bien bien = null;

            switch (this.estadoDetalle)
            {
                case EstadoActual.Nuevo:
                    bien = GetBien();
                    int index = this.dgvDetalle.Rows.Add(1);
                    this.dgvDetalle.Rows[index].Cells[0].Value = bien.IdBien;
                    this.dgvDetalle.Rows[index].Cells[1].Value = bien;
                    if (this.cmbTipoOrden.SelectedIndex == 0)
                    {
                        this.dgvDetalle.Rows[index].Cells[2].Value = this.txtCantidadB.Text;
                    }
                    else
                    {
                        this.dgvDetalle.Rows[index].Cells[2].Value = 1;
                    }
                    this.dgvDetalle.Rows[index].Cells[3].Value = bien.Precio;
                    break;
                case EstadoActual.Editar:
                    bien = GetBien();
                    this.dgvDetalle.CurrentRow.Cells[0].Value = bien.IdBien;
                    this.dgvDetalle.CurrentRow.Cells[1].Value = bien;
                    if (this.cmbTipoOrden.SelectedIndex == 0)
                    {
                        this.dgvDetalle.CurrentRow.Cells[2].Value = this.txtCantidadB.Text;
                    }
                    else
                    {
                        this.dgvDetalle.CurrentRow.Cells[2].Value = 1;
                    }
                    this.dgvDetalle.CurrentRow.Cells[3].Value = bien.Precio;
                    break;
                case EstadoActual.Eliminar:
                    this.dgvDetalle.Rows.Remove(this.dgvDetalle.CurrentRow);
                    break;
                default:
                    break;
            }
            return result;
        }

        private OrdenCompra GetOrdenCompra()
        {
            OrdenCompra ordenCompra = new OrdenCompra
            {
                IdOrdenCompra = Convert.ToInt32(this.identificador),
                Fecha = this.dtpFecha.Value,
                Empleados = new Empleados { IdEmpleado = Empresa.Usuario.IdEmpleado },
                OrdenPedido = new OrdenPedido { IdOrdenPedido = Convert.ToInt32(this.cmbPedido.SelectedValue) },
                Proveedor = new Proveedor { IdProveedor = Convert.ToInt32(this.cmbProveedor.SelectedValue) },
                Descripcion = this.txtDescripcion.Text,
                Estado = true
            };
            foreach (DataGridViewRow row in this.dgvDetalle.Rows)
            {
                ordenCompra.Detalle.Add(new DetalleOrdenCompra
                {
                    Bien = row.Cells[1].Value as Bien,
                    Cantidad = Convert.ToDecimal(row.Cells[2].Value),
                    Monto = Convert.ToDecimal(row.Cells[3].Value)
                });
            }
            return ordenCompra;
        }

        private Bien GetBien()
        {
            switch (this.cmbTipoOrden.SelectedIndex)
            {
                case 0: // Bien
                    Bien bien = new Bien();
                    bien.IdBien = int.Parse(this.lblIdBien.Text);
                    bien.StockMinimo = 0;
                    bien.Nombre = this.txtNombreB.Text;
                    bien.StockActual = Convert.ToDecimal(this.txtCantidadB.Tag);
                    bien.Precio = decimal.Parse(this.txtPrecioB.Text);
                    bien.Estado = this.cmbEstadoB.SelectedIndex;
                    bien.UnidadMedidia = new UnidadMedidia { IdUnidadMedida = Convert.ToInt32(this.cmbUnidadB.SelectedValue) };
                    bien.Descripcion = this.txtDescripcionB.Text;
                    return bien;
                case 1: // Vehiculo
                    Vehiculo vehiculo = new Vehiculo();
                    vehiculo.IdBien = int.Parse(this.lblIdBien.Text);
                    vehiculo.StockMinimo = 0;
                    vehiculo.Nombre = this.txtMarcaV.Text + " " + this.txtModeloV.Text + " " + this.txtNumeroV.Text;
                    vehiculo.Descripcion = this.txtDescripcionV.Text;
                    vehiculo.StockActual = 1;
                    vehiculo.Estado = this.cmbEstadoV.SelectedIndex;
                    vehiculo.Precio = decimal.Parse(this.txtPrecioV.Text);
                    vehiculo.UnidadMedidia = BienManager.Instancia.ObtenerMedidaBase();
                    vehiculo.NroPlaca = this.txtNumeroV.Text.Trim();
                    vehiculo.Marca = this.txtMarcaV.Text.Trim();
                    vehiculo.Modelo = this.txtModeloV.Text.Trim();
                    vehiculo.TipoVehiculo = this.cmbTipoV.SelectedIndex;
                    return vehiculo;
                case 2: // Telefono
                    Telefono telefono = new Telefono();
                    telefono.IdBien = int.Parse(this.lblIdBien.Text);
                    telefono.StockMinimo = 0;
                    telefono.Nombre = this.txtMarcaT.Text + " " + this.txtModeloT.Text + " " + this.txtNumeroT.Text;
                    telefono.Descripcion = this.txtDescripcionV.Text;
                    telefono.StockActual = 1;
                    telefono.Estado = this.cmbEstadoV.SelectedIndex;
                    telefono.Precio = decimal.Parse(this.txtPrecioT.Text);
                    telefono.UnidadMedidia = BienManager.Instancia.ObtenerMedidaBase();
                    telefono.NroCelular = this.txtNumeroV.Text.Trim();
                    telefono.Marca = this.txtMarcaV.Text.Trim();
                    telefono.Modelo = this.txtModeloV.Text.Trim();
                    telefono.TipoCelular = this.cmbTipoV.SelectedIndex.ToString();
                    return telefono;
                default: return null;
            }
        }

        private bool ValidateDetailData()
        {
            bool result = true;

            switch (this.cmbTipoOrden.SelectedIndex)
            {
                case 0: // Bien
                    if (string.IsNullOrEmpty(this.txtNombreB.Text))
                    {
                        this.errValidator.SetError(this.txtNombreB, "Ingresar Nombre.");
                        result = false;
                    }
                    else
                    {
                        this.errValidator.SetError(this.txtNombreB, string.Empty);
                    }
                    if (string.IsNullOrEmpty(this.txtCantidadB.Text))
                    {
                        this.errValidator.SetError(this.txtCantidadB, "Ingresar Stock.");
                        result = false;
                    }
                    else
                    {
                        this.errValidator.SetError(this.txtCantidadB, string.Empty);
                    }
                    if (string.IsNullOrEmpty(this.txtPrecioB.Text))
                    {
                        this.errValidator.SetError(this.txtPrecioB, "Ingresar Precio.");
                        result = false;
                    }
                    else
                    {
                        this.errValidator.SetError(this.txtPrecioB, string.Empty);
                    }
                    if (this.cmbEstadoB.SelectedIndex == -1)
                    {
                        this.errValidator.SetError(this.cmbEstadoB, "Seleccionar Estado.");
                        result = false;
                    }
                    else
                    {
                        this.errValidator.SetError(this.cmbEstadoB, string.Empty);
                    }
                    if (this.cmbUnidadB.SelectedIndex == -1)
                    {
                        this.errValidator.SetError(this.cmbUnidadB, "Seleccionar Unidad Medida.");
                        result = false;
                    }
                    else
                    {
                        this.errValidator.SetError(this.cmbUnidadB, string.Empty);
                    }
                    break;
                case 1: // Vehiculo
                    if (string.IsNullOrEmpty(this.txtNumeroV.Text))
                    {
                        this.errValidator.SetError(this.txtNumeroV, "Ingresar Nro. Placa.");
                        result = false;
                    }
                    else
                    {
                        this.errValidator.SetError(this.txtNumeroV, string.Empty);
                    }
                    if (string.IsNullOrEmpty(this.txtModeloV.Text))
                    {
                        this.errValidator.SetError(this.txtModeloV, "Ingresar Modelo.");
                        result = false;
                    }
                    else
                    {
                        this.errValidator.SetError(this.txtModeloV, string.Empty);
                    }
                    if (string.IsNullOrEmpty(this.txtMarcaV.Text))
                    {
                        this.errValidator.SetError(this.txtMarcaV, "Ingresar Marca.");
                        result = false;
                    }
                    else
                    {
                        this.errValidator.SetError(this.txtMarcaV, string.Empty);
                    }
                    if (string.IsNullOrEmpty(this.txtPrecioV.Text))
                    {
                        this.errValidator.SetError(this.txtPrecioV, "Ingresar Precio.");
                        result = false;
                    }
                    else
                    {
                        this.errValidator.SetError(this.txtPrecioV, string.Empty);
                    }
                    if (this.cmbTipoV.SelectedIndex == -1)
                    {
                        this.errValidator.SetError(this.cmbTipoV, "Seleccionar Tipo.");
                        result = false;
                    }
                    else
                    {
                        this.errValidator.SetError(this.cmbTipoV, string.Empty);
                    }
                    if (this.cmbEstadoV.SelectedIndex == -1)
                    {
                        this.errValidator.SetError(this.cmbEstadoV, "Seleccionar Estado.");
                        result = false;
                    }
                    else
                    {
                        this.errValidator.SetError(this.cmbEstadoV, string.Empty);
                    }
                    break;
                case 2: // Telefono
                    if (string.IsNullOrEmpty(this.txtNumeroT.Text))
                    {
                        this.errValidator.SetError(this.txtNumeroT, "Ingresar Nro. Celular.");
                        result = false;
                    }
                    else
                    {
                        this.errValidator.SetError(this.txtNumeroT, string.Empty);
                    }
                    if (string.IsNullOrEmpty(this.txtModeloT.Text))
                    {
                        this.errValidator.SetError(this.txtModeloT, "Ingresar Modelo.");
                        result = false;
                    }
                    else
                    {
                        this.errValidator.SetError(this.txtModeloT, string.Empty);
                    }
                    if (string.IsNullOrEmpty(this.txtMarcaT.Text))
                    {
                        this.errValidator.SetError(this.txtMarcaT, "Ingresar Marca.");
                        result = false;
                    }
                    else
                    {
                        this.errValidator.SetError(this.txtMarcaT, string.Empty);
                    }
                    if (string.IsNullOrEmpty(this.txtPrecioT.Text))
                    {
                        this.errValidator.SetError(this.txtPrecioT, "Ingresar Precio.");
                        result = false;
                    }
                    else
                    {
                        this.errValidator.SetError(this.txtPrecioT, string.Empty);
                    }
                    if (this.cmbTipoT.SelectedIndex == -1)
                    {
                        this.errValidator.SetError(this.cmbTipoT, "Seleccionar Tipo.");
                        result = false;
                    }
                    else
                    {
                        this.errValidator.SetError(this.cmbTipoT, string.Empty);
                    }
                    if (this.cmbEstadoT.SelectedIndex == -1)
                    {
                        this.errValidator.SetError(this.cmbEstadoT, "Seleccionar Estado.");
                        result = false;
                    }
                    else
                    {
                        this.errValidator.SetError(this.cmbEstadoT, string.Empty);
                    }
                    break;
                default: break;
            }

            return result;
        }

        protected override bool ValidateData()
        {
            bool result = true;

            if (this.cmbProveedor.SelectedIndex == -1)
            {
                this.errValidator.SetError(this.cmbProveedor, "Seleccionar un Proveedor.");
                result = false;
            }
            else
            {
                this.errValidator.SetError(this.cmbProveedor, string.Empty);
            }
            if (this.cmbPedido.SelectedIndex == -1)
            {
                this.errValidator.SetError(this.cmbPedido, "Seleccionar una Orden de Pedido.");
                result = false;
            }
            else
            {
                this.errValidator.SetError(this.cmbPedido, string.Empty);
            }
            if (this.dgvDetalle.Rows.Count == 0)
            {
                Mensaje.ShowMessageAlert(this.ParentForm, this.Titulo, "No existe bienes para realizar la Compra.");
                result = false;
            }
            return result;
        }

        private void ClearDetailCotrols()
        {
            this.lblIdBien.Text = "0";

            this.txtNombreB.Clear();
            this.txtCantidadB.Clear();
            this.txtCantidadB.Tag = 0;
            this.txtPrecioB.Clear();
            this.cmbEstadoB.SelectedIndex = -1;
            this.cmbUnidadB.SelectedIndex = -1;
            this.txtDescripcionB.Clear();

            this.txtNumeroV.Clear();
            this.txtModeloV.Clear();
            this.txtMarcaV.Clear();
            this.cmbTipoV.SelectedIndex = -1;
            this.txtPrecioV.Clear();
            this.cmbEstadoV.SelectedIndex = -1;
            this.txtDescripcionV.Clear();

            this.txtNumeroT.Clear();
            this.txtModeloT.Clear();
            this.txtMarcaT.Clear();
            this.cmbTipoT.SelectedIndex = -1;
            this.txtPrecioT.Clear();
            this.cmbEstadoT.SelectedIndex = -1;
            this.txtDescripcionT.Clear();

            this.errValidator.Clear();
        }

        protected override void ClearControls()
        {
            this.identificador = 0;
            this.dgvDetalle.Rows.Clear();
            base.ClearControls();
        }

        private void EnabledDetailButtons()
        {
            switch (this.estadoDetalle)
            {
                case EstadoActual.Normal:
                    switch (this.dgvDetalle.Rows.Count)
                    {
                        case 0:
                            this.btnNuevo.Enabled = true;
                            this.btnEditar.Enabled = false;
                            this.btnEliminar.Enabled = false;
                            this.btnGuardar.Enabled = false;
                            this.btnCancelar.Enabled = false;
                            this.dgvDetalle.Enabled = true;
                            this.tabMantenedores.Enabled = false;
                            this.cmbBienes.Enabled = false;
                            this.btnLimpiar.Enabled = false;
                            break;
                        default:
                            if (this.dgvDetalle.SelectedRows.Count == 0)
                            {
                                this.btnNuevo.Enabled = true;
                                this.btnEditar.Enabled = false;
                                this.btnEliminar.Enabled = false;
                                this.btnGuardar.Enabled = false;
                                this.btnCancelar.Enabled = false;
                                this.dgvDetalle.Enabled = true;
                                this.tabMantenedores.Enabled = false;
                                this.cmbBienes.Enabled = false;
                                this.btnLimpiar.Enabled = false;
                            }
                            else
                            {
                                this.btnNuevo.Enabled = true;
                                this.btnEditar.Enabled = true;
                                this.btnEliminar.Enabled = true;
                                this.btnGuardar.Enabled = false;
                                this.btnCancelar.Enabled = false;
                                this.dgvDetalle.Enabled = true;
                                this.tabMantenedores.Enabled = false;
                                this.cmbBienes.Enabled = false;
                                this.btnLimpiar.Enabled = false;
                            }
                            break;
                    }
                    break;
                case EstadoActual.Nuevo:
                case EstadoActual.Editar:
                    this.btnNuevo.Enabled = false;
                    this.btnEditar.Enabled = false;
                    this.btnEliminar.Enabled = false;
                    this.btnGuardar.Enabled = true;
                    this.btnCancelar.Enabled = true;
                    this.dgvDetalle.Enabled = false;
                    this.tabMantenedores.Enabled = true;
                    this.cmbBienes.Enabled = true;
                    this.btnLimpiar.Enabled = true;
                    break;
            }
        }

        protected override void EnabledControls(bool valor)
        {
            this.tabMaestro.Enabled = !valor;
            base.EnabledControls(valor);
        }

        #region Miembros de Observador

        public void Notificar(object mensaje)
        {
            switch (mensaje.ToString())
            {
                case "CwfProveedor":
                    LoadProveedores();
                    break;
                case "CwfUnidadMedida":
                    LoadUnidadMedidas();
                    break;
                default:
                    break;
            }
        }

        #endregion
    }
}
